package br.affCorp.controller.persistence.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;

import br.affCorp.controller.persistence.ConnectionSingleton;
import br.affCorp.controller.rdf.GenericRDF;
import br.affCorp.model.UsuarioDTO;

public class UsuarioDAO {

	private Connection conn = null;
	private PreparedStatement ps = null;
	private ResultSet rs = null;

	public UsuarioDTO autenticar(UsuarioDTO usuarioDTO) throws Exception {
		try {
			this.conn = ConnectionSingleton.getConnection();

			StringBuffer sb = new StringBuffer();

			sb.append(" SELECT					");
			sb.append("	   ID,			");
			sb.append("	   LOGIN,			");
			sb.append("	   EMAIL,			");
			sb.append("	   SENHA,			");
			sb.append("	   NOME,			");
			sb.append("	   SOBRENOME,			");
			sb.append("	   SOCIAL_ID,			");
			sb.append("	   NICK_NAME,			");
			sb.append("	   DATA_CADASTRO			");
			sb.append("	FROM					");
			sb.append("	   USUARIOS				");
			sb.append("	WHERE					");
			sb.append("	   LOGIN = ?		");

			ps = conn.prepareStatement(sb.toString());

			ps.setString(1, usuarioDTO.getLogin());

			rs = ps.executeQuery();

			if (rs.next()) {

				usuarioDTO.setId(rs.getLong("ID"));
				usuarioDTO.setLogin(rs.getString("LOGIN"));
				usuarioDTO.setEmail(rs.getString("EMAIL"));
				usuarioDTO.setSenha(rs.getString("SENHA"));
				usuarioDTO.setNome(rs.getString("NOME"));
				usuarioDTO.setSobreNome(rs.getString("SOBRENOME"));
				usuarioDTO.setUid(rs.getString("SOCIAL_ID"));
				usuarioDTO.setNickName(rs.getString("NICK_NAME"));
				usuarioDTO.setDataCadastro(rs.getDate("DATA_CADASTRO"));

			} else {
				usuarioDTO = null;
			}

			ps.close();

		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			ConnectionSingleton.closeConnection(conn, ps);
		}
		return usuarioDTO;
	}

	public void save(UsuarioDTO usuarioDTO) throws Exception {
		try {
			this.conn = ConnectionSingleton.getConnection();
			if (!isAssociado(usuarioDTO)) {
				this.inserir(usuarioDTO);
			} else {
				this.alterar(usuarioDTO);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionSingleton.closeConnection(conn, ps);
		}
	}

	public void saveAll(UsuarioDTO usuarioDTO) throws Exception {
		try {
			this.conn = ConnectionSingleton.getConnection();
			Collection<UsuarioDTO> usuarios = usuarioDTO.getAmigos();
			usuarios.add(usuarioDTO);

			for (UsuarioDTO usuario : usuarios) {
				if (!isAssociado(usuario)) {
					this.inserir(usuario);
				} else {
					this.alterar(usuario);
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionSingleton.closeConnection(conn, ps, rs);
		}
	}

	private void inserir(UsuarioDTO usuarioDTO) throws Exception {
		try {
			this.conn = ConnectionSingleton.getConnection();
			StringBuffer sb = new StringBuffer();

			sb.append(" INSERT INTO USUARIOS	");
			sb.append("	   (SOCIAL_ID,			");
			sb.append("	    NICK_NAME,			");
			sb.append("	    NOME,				");
			sb.append("	    SOBRENOME,			");
			sb.append("	    EMAIL,				");
			sb.append("	    LOGIN,				");
			sb.append("		DATA_CADASTRO)		");
			sb.append("	VALUES					");
			sb.append("	   (?,					");
			sb.append("	    ?,					");
			sb.append("	    ?,					");
			sb.append("	    ?,					");
			sb.append("	    ?,					");
			sb.append("	    ?,					");
			sb.append("	    SYSDATE)			");

			ps = conn.prepareStatement(sb.toString());

			ps.setString(1, usuarioDTO.getUid());
			ps.setString(2, usuarioDTO.getNickName());
			ps.setString(3, usuarioDTO.getNome());
			ps.setString(4, usuarioDTO.getSobreNome());
			ps.setString(5, usuarioDTO.getEmail());
			ps.setString(6, usuarioDTO.getLogin());

			ps.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionSingleton.closeConnection(conn, ps);
		}
	}

	private void alterar(UsuarioDTO usuarioDTO) throws Exception {
		try {
			this.conn = ConnectionSingleton.getConnection();
			StringBuffer sb = new StringBuffer();

			sb.append(" UPDATE USUARIOS	SET		");
			sb.append("	   NOME = ?,			");
			sb.append("	   SOBRENOME = ?		");
			sb.append("	WHERE					");
			sb.append("	   SOCIAL_ID = ?		");

			ps = conn.prepareStatement(sb.toString());

			ps.setString(1, usuarioDTO.getNome());
			ps.setString(2, usuarioDTO.getSobreNome());
			ps.setString(3, usuarioDTO.getUid());

			ps.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionSingleton.closeConnection(conn, ps);
		}
	}

	public boolean isAssociado(UsuarioDTO usuarioDTO) throws Exception {
		boolean response = false;
		try {
			this.conn = ConnectionSingleton.getConnection();
			StringBuffer sb = new StringBuffer();

			sb.append(" SELECT					");
			sb.append("	   LOGIN			");
			sb.append("	FROM					");
			sb.append("	   USUARIOS				");
			sb.append("	WHERE					");
			sb.append("	   SOCIAL_ID = ?		");

			ps = conn.prepareStatement(sb.toString());

			String UID = GenericRDF.obterValorResourceID(usuarioDTO.getUid());

			ps.setString(1, UID);

			rs = ps.executeQuery();

			if (rs.next()) {
				usuarioDTO.setLogin(rs.getString("LOGIN"));
				usuarioDTO.setUid(UID);
				usuarioDTO.setDominio(usuarioDTO.getLogin());
				response = true;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionSingleton.closeConnection(conn, ps, rs);
		}
		return response;
	}
}
